package cn.dengta.webapp.trade.vo;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import javax.annotation.Nullable;

import cn.dengta.common.model.BizFlag;
import cn.dengta.common.util.Formats;
import cn.dengta.common.web.Client;
import cn.dengta.context.model.DateUnit;
import cn.dengta.webapp.base.vo.AbstractVO;
import cn.dengta.webapp.trade.entity.RechargeLog;
import cn.dengta.webapp.trade.entity.RechargeReissueLog;
import cn.dengta.webapp.trade.model.*;
import lombok.Getter;
import lombok.Setter;
import me.codeplayer.util.EasyDate;
import me.codeplayer.util.X;

@Getter
@Setter
public class RechargeLogVO extends AbstractVO<RechargeLog> {

	/** 用户ID */
	protected Long userId;
	/** 推广员ID */
	protected Long agentId;
	/** 推广员 */
	protected Map<String, Object> agent;
	/** 本地订单号，不一样的平台可能 order_no = trade_no */
	protected String orderNo;
	/** 第三方订单号（来自在线支付平台） */
	protected String tradeNo;
	protected String userNickname;
	/** 类型：1=充值钻石；2=VIP充值；3=购买提升搭讪推荐曝光率服务；4=积分兑换 */
	protected Integer type;
	/** 充值钻石数（不包含免费赠送的钻石数） */
	protected Integer coin;
	/** 免费赠送的钻石数（不含VIP免费赠送数） */
	protected Integer freeCoin;
	/** 如果用户是VIP，额外赠送的虚拟币 */
	protected Integer vipFreeCoin;
	/** 商品标价（也是支付价格） */
	protected BigDecimal price;
	/** 实际支付总额 */
	protected BigDecimal realPay;
	/** 支付平台：1=Google；2=Apple；3=PayPal；4=Payoneer */
	protected Integer platform;
	/** 币种 */
	private transient String currency;
	/**
	 * 充值状态：-99=已关闭；-2=已退款；-1=退款中；0=待支付；1=处理中；2=已支付成功
	 *
	 * @see cn.dengta.webapp.trade.model.RechargeStatus
	 */
	protected transient Integer status;
	/**
	 * 客户端类型：2=Android；3=iOS
	 *
	 * @see cn.dengta.common.web.Client
	 */
	protected Client client;
	/** 退款总数 */
	protected BigDecimal refundSum;
	/** VIP开始时间 */
	private Date vipStartTime;
	/** VIP天数 */
	private Integer vipDays;

	/* =========== 以下是后台管理系统需要的属性 ========== */
	@Nullable
	protected transient Long bizFlag;
	/** 是否是首次充值 */
	protected Boolean firstFlag;
	/** 当前是否是VIP */
	protected Boolean isVip;
	/** 用户信息 */
	protected Map<String, Object> user;
	/** 第三方的错误信息 */
	private String resultMsg;

	/** 是否已补发 */
	public boolean reissued;
	/** 补发信息 */
	public RechargeReissueLog reissueInfo;

	/** 真实人民币价格 */
	private BigDecimal realPriceCny;

	public static RechargeLogVO fromFront(RechargeLog source) {
		return copy(source, RechargeLogVO::new, "vipDays", "vipStartTime", "refundSum");
	}

	public static RechargeLogVO from(RechargeLog source) {
		return copy(source, RechargeLogVO::new);
	}

	public Boolean getFirstFlag() {
		return bizFlag != null && BizFlag.hasFlag(bizFlag, RechargeLog.BIZ_FLAG_FIRST_FLAG);
	}

	public Boolean getIsVip() {
		return bizFlag != null && BizFlag.hasFlag(bizFlag, RechargeLog.BIZ_FLAG_IS_VIP);
	}

	public String getStatus_() {
		return X.map(RechargeStatus.of(status), RechargeStatus::getLabel);
	}
	public Integer getStatusValue() {
		return status;
	}

	public String getPlatform_() {
		return X.map(PayPlatform.of(platform), PayPlatform::name);
	}

	public String getAddTime_() {
		return Formats.formatDatetime(addTime);
	}

	public String getRealPay_() {
		return Formats.formatNumber_M(realPay);
	}
	public String getRealPriceCny_() {
		return Formats.formatNumber_M(realPriceCny);
	}
	public String getPrice_() {
		return Formats.formatNumber_D(price);
	}

	public String getRefundSum_() {
		return Formats.formatNumber_D(refundSum);
	}

	public String getVipMonths_() {
		return DateUnit.calcDesc(vipDays);
	}

	public String getVipStartTime_() {
		return Formats.formatDatetime(vipStartTime);
	}

	public String getCurrency_() {
		return X.map(Currency.of(currency), Currency::getLabel);
	}

	public String getVipEndTime_() {
		return vipStartTime != null && vipDays != null ? Formats.formatDatetime(new EasyDate(vipStartTime).addDay(vipDays).toDate()) : null;
	}

	public String getType_() {
		return X.map(PayType.of(type), PayType::getLabel);
	}

}
